
package com.probiz.estore.sales.service;

import java.util.List;

import com.probiz.estore.common.model.catalog.ProductCategory;
import com.probiz.estore.common.model.product.Product;
import com.probiz.estore.common.model.sales.RecommendedProduct;
import com.probiz.estore.core.service.GenericManager;

public interface RecommendedProductManager extends	GenericManager<RecommendedProduct> {
	/**
	 *  根据推荐类型和源商品或目录Id来获得其推荐商品列表
	 * @param recommendedTypeId 推荐类型id
	 * @param sourceKind 源类型
	 * @param sourceId 源id
	 * @param firstResult 开始
	 * @param maxResults 最大值
	 * @return 商品列表
	 */
	public List<RecommendedProduct> getRecommendedProductsByRecommendedTypeIdBySourceId(final int recommendedTypeId, final Integer sourceKind,final Integer sourceId, final int firstResult, final int maxResults);


	/**
	 * 根据推荐类型、源商品或目录Id和推荐商品Id获得该推荐商品 sourceProductId和sourceCategoryId 只需指定其中一个
	 * @param recommendedTypeId 推荐类型id
	 * @param sourceKind 源类型
	 * @param sourceId 源id
	 * @param productId 推荐商品id
	 * @return 关联实体
	 */
	public RecommendedProduct getRecommendedProduct(Integer recommendedTypeId,int sourceKind,Integer sourceId, Integer productId);

	/**
	 * 手动评估  根据[推荐类型name][源Id]获得特定范围的推荐产品(不能重复) sourceProductId和sourceCategoryId 只需指定其中一个
	 * @param recommendedTypeName 推荐类型名称
	 * @param sourceKind 源类型
	 * @param sourceId 源id
	 * @param firstResult 开始
	 * @param maxResults 最大数量
	 * @return 商品列表
	 */
	public List<Product> getProductsByRecommendedTypeNameBySourceId(final String recommendedTypeName, final int sourceKind, final Integer sourceId, final int firstResult, final int maxResults) ;
	/**
	 * 手动评估  根据[推荐类型name][源IdList]获得特定范围的推荐产品(不能重复) sourceProductIds和sourceCategoryIds 只需指定其中一个
	 * @param recommendedTypeName 推荐类型名称
	 * @param sourceKind 源类型
	 * @param sourceIds 源id list
	 * @param firstResult 开始
	 * @param maxResults 最大数量
	 * @return
	 */
	public List<Product> getProductsByRecommendedTypeNameBySourceIdList(final String recommendedTypeName, final int sourceKind, final List<Integer> sourceIds,	final int firstResult, final int maxResults);
	/**
	 * 手动评估  根据[推荐类型id][源Id]获得特定范围的推荐产品(不能重复) sourceProductId和sourceCategoryId 只需指定其中一个
	 * @param recommendedTypeId 推荐类型id
	 * @param sourceKind 源类型
	 * @param sourceId 源id
	 * @param firstResult 开始
	 * @param maxResults 最大数量
	 * @return
	 */
	public List<Product> getProductsByRecommendedTypeIdBySourceId(final Integer recommendedTypeId, final int sourceKind,  final Integer sourceId,	final int firstResult, final int maxResults);
	

	/**
	 * 保存相似商品，要把关联的相似商品也要保存
	 * @param recommendedProduct 关联实体
	 */
	public void saveSimilarProducts(RecommendedProduct recommendedProduct);

	/**
	 * 删除相似商品，要把关联的相似商品也要删除
	 * @param recommendedProduct 关联实体
	 */
	public void removeSimilarProducts(RecommendedProduct recommendedProduct);
	
	/**
	 * 重载 delete方法
	 * @param recommendedProduct 关联实体
	 */
	public void delete(RecommendedProduct recommendedProduct);
	/**
	 * 保存关联推荐商品 ，从数组中获取必要的参数 sourceProduct和sourceCategory 只需指定其中之一
	 * @param sourceProduct 源商品
	 * @param sourceCategory 源目录
	 * @param recommendedTypes 推荐类型数组
	 * @param productIds 关联推荐商品id
	 */
	public void saveRecommendedProductsFromArrays(Product sourceProduct,ProductCategory sourceCategory,String[] recommendedTypeIds,String[] productIds);
	
	
}
